package common.exception;

/**
 * La classe fornisce metodi statici per lavorare con le eccezioni.
 * 
 * @author Jacopo Ferrigno
 *
 */

public class ExceptionHandler {
	
	public static String [][] exceptionComand=
	{{"BusyNameException","usernameOccupato"},
	{"BusyNameException","nomeRazzaOccupato"},
	{"FailedAuthenticationException","auteticazioneFallita"},
	{"FullMatchException","troppiGiocatori"},
	{"InvalidDestinationException","destinazioneNonValida"},
	{"InvalidIdException","idNonValido"},
	{"InvalidTokenException","tokenNonValido"},
	{"MaxNumberOfDinoException","raggiuntoNumeroMaxDinosauri"},
	{"NoMoreActionException","raggiuntoLimiteMosseDinosauro"},
	{"NotInMatchException","nonInPartita"},
	{"NotYourTurnException","nonIlTuoTurno"},
	{"StarvedException","mortePerInedia"},
	{"IllegalArgumentException","ArgomentoNonValido"},
	{"RuntimeException","RuntimeException"},
	{"ExtinctionException","specieEstinta"},
	};
	
	
	
	
	
	
	
	/**
	 * Ritorna il nome semplice, quindi senza path, dell'eccezione passata come parametro
	 * 
	 * @param exception Ecezione di cui ottnere il nome semplice
	 * @return la stringa contenente il nome dell'eccezione
	 */
	public static String getSimpleName(Exception exception){
		
		return exception.getClass().getSimpleName();
	}
	
	/**
	 * Ritorna il nome completo dell'ecezione passata come parametro
	 * 
	 * @param exception
	 * @return nome completo dell'ecezione
	 */
	public static String getExceptionName(Exception exception){
		
		return exception.getClass().getName();
	}
	
	/**
	 * Passa dal nome dell'eccezione al comando, SENZA LA @ iniziale. Praticamente traduce in italiano il nome dell'eccezioone.
	 * 
	 *
	 * @param exception Eccezione di cui sapere il nome
	 * @return nome del comando associato all'eccezione
	 */
	public static String fromExceptionToComand(Exception exception){
		String exceptionName=getSimpleName(exception);
		String comandName=null;
		for(int i=0; i< exceptionComand.length ; i++){
			if(exceptionName.equalsIgnoreCase(exceptionComand[i][0])){
				comandName=exceptionComand[i][1];
				break;
			}
		}
				
		return comandName;
		
	}
	
	/**
	 * Passa dal comando all nome dell'ecezione corrispondente.Comprensivo di path
	 * 
	 * @param comand
	 * @return il nome completo dell'ecezione
	 */
	
	public static String fromComandToExceptionName(String comand){
		String comandName=comand;
		String exceptionName=null;
		
		
		for(int i=0; i<exceptionComand.length; i++ ){
			if(comandName.equalsIgnoreCase(exceptionComand[i][1])){
				exceptionName=exceptionComand[i][0];
				break;
			}
		}
		//ottengo il basePath
		BusyNameException exception=new BusyNameException();
		String fullPath=getExceptionName(exception);
		fullPath.replace("BusyNameException", exceptionName);
		exceptionName=fullPath;
		
		return exceptionName;
	}
	
	/**Metodo che genera un ecezione partendo dal nome completo.
	 * 
	 * @param fullname nome comprensivo di classe, dell'ecezione da generare
	 * @return
	 * @throws ClassNotFoundException nel caso la classe non esiste
	 * @throws InstantiationException 
	 * @throws IllegalAccessException
	 */
	public static Exception getException(String fullname)
		throws ClassNotFoundException, InstantiationException,
        IllegalAccessException {
    
		return (Exception)Class.forName(fullname).newInstance();
		
	}
	/**
	 * Controlla che il comando passato non sia un eccezione.
	 * @param comandName
	 * @return
	 */
	
	public static boolean isException(String comandName){
		boolean found=false;
		
		for(int i=0; i<exceptionComand.length; i++ ){
			if(comandName.equalsIgnoreCase(exceptionComand[i][1])){
				found=true;
				break;
				}
		
	
		}
	
		
		return found;
	}

	

}
	

